package model;


public class Matriz {

	private int m;
	private int n;
	private double valor[][];
	private Matriz L;
	private Matriz U;
	
	public Matriz(int m) {
		valor=new double[m][3];
		this.m=m;
		this.n=3;
	}

	public int getM() {
		return m;
	}

	public int getN() {
		return n;
	}

	public double getValor(int i,int j) {
		if(j-i>=-1 && j-i<=1){
			return valor[i][j-i+1];
		}else{
			return 0;
		}
	}

	public void setValor(int i,int j,double valor) {
		if(j-i>=-1 && j-i<=1){
			this.valor[i][j-i+1] = valor;
		}
	}

	public Matriz getL() {
		return L;
	}

	public void setL(Matriz l) {
		L = l;
	}

	public Matriz getU() {
		return U;
	}

	public void setU(Matriz u) {
		U = u;
	}
	
	public static void fatoracaoLUEliminacaoGaussiana(Matriz m){
		Matriz L=new Matriz(m.getM());
		Matriz U=Matriz.copia(m);
		for(int i=0;i<m.getM()-1;i++){
			L.setValor(i, i, 1);
			for(int j=i+1;j<m.getM();j++){
				L.setValor(j, i, (U.getValor(j, i)/U.getValor(i, i)));
				for(int k=0;k<m.getM();k++){
					U.setValor(j, k, U.getValor(j,k)-U.getValor(i, k)*L.getValor(j, i));
				}
			}
		}
		L.setValor(m.getM()-1, m.getM()-1, 1);
		m.setL(L);
		m.setU(U);
	}
	
	private static Matriz copia(Matriz m){
		Matriz m2=new Matriz(m.getM());
		for(int i=0;i<m.getM();i++){
			for(int j=0;j<m.getM();j++){
				m2.setValor(i, j, m.getValor(i, j));
			}
		}
		return m2;
	}
	
    public Matriz gerarMatrizGlobal(Elemento[] elemento,int numeroElementos){
		
		this.setValor(0, 0, elemento[0].getMatrizLocal().getValor(0, 0));
		this.setValor(0, 1, elemento[0].getMatrizLocal().getValor(0, 1));
		this.setValor(1, 0,this.getValor(0,1));
		for(int i=1;i<this.getM()-1;i++){
			this.setValor(i, i, elemento[i-1].getMatrizLocal().getValor(1,1)+elemento[i].getMatrizLocal().getValor(0, 0));
			this.setValor(i, i+1, elemento[i].getMatrizLocal().getValor(0,1));
			this.setValor(i+1, i, this.getValor(i,i+1));
		}
		this.setValor(numeroElementos,numeroElementos,elemento[numeroElementos-1].getMatrizLocal().getValor(1, 1));
		
		return this;
	}
    
    public void addCondicoesContorno(int tipo,int numeroElementos){   
    	//1-Dirichlet
		//3-mista1 -derivada,valor
		//4-mista2 -valor,derivada
		switch(tipo){
			case 1:
				this.setValor(0, 0, 1);
				this.setValor(0, 1,0);
				this.setValor(1, 0,0);
				this.setValor(numeroElementos-1, numeroElementos,0);
				this.setValor(numeroElementos, numeroElementos-1, 0);
				this.setValor(numeroElementos, numeroElementos, 1);
				break;
			case 3:
				this.setValor(numeroElementos-1, numeroElementos,0);
				this.setValor(numeroElementos, numeroElementos-1, 0);
				this.setValor(numeroElementos, numeroElementos, 1);
				break;
			case 4:
				this.setValor(0, 0, 1);
				this.setValor(0, 1,0);
				this.setValor(1, 0,0);
		}
		
    }
}
